//demo实际没有什么具体电路或功能，大家注释语法即可，能看懂每句verilog是啥意思就可，不需要纠结整体，testbench_demo.v同理
module demo (
    input           clk,        //输入时钟信号
    input           rst_n,      //输入复位信号
    input   [3:0]   i_data,     //4位宽的输入信号i_data
    input   [3:0]   q_data,     //4位宽的输入信号q_data
    input           ready_in,   
    input   [1:0]   sel,        //2位宽的输入信号sel
    output  [4:0]   out_data,   //输出5位宽的out_data
    output          ready_out     
);

    reg [3:0] i_data_reg;       //i_data_reg为4位寄存器型信号
    reg [3:0] q_data_reg;       //q_data_reg为4位寄存器型信号
    reg [3:0] out_data_reg;     //out_data_reg为4位寄存器型信号

    reg [3:0] cnt;              //cnt为4位寄存器型信号

    //计数器
    always @(posedge clk or negedge rst_n) begin
        if(!rst_n)
            cnt<=4'b0;              //复位时置零
        
        else if(cnt==4'd8)
            cnt<=4'b0;              //达到最大值时置零
        
        else 
            cnt<=cnt+1'b1;          //非以上情况计数值+1
    end

    //reg in
    //以下同上
    always @(posedge clk or negedge rst_n) begin
        if(!rst_n)
            i_data_reg<=4'd0;
        else if(cnt==4'd4)
            i_data_reg<=4'd3;
        else if(ready_in)
            i_data_reg<=i_data;
    end
    always @(posedge clk or negedge rst_n) begin
        if(!rst_n)
            q_data_reg<=4'd0;
        else if(cnt==4'd4)
            q_data_reg<=4'd3;
        else if(ready_in)
            q_data_reg<=q_data;
    end  

//-------------------------------------写法1------------------------------------------//
/*
    //MUX
    //sel四种信号值对应不同的输出值计算方式
    always @(*) begin
        case (sel)
            2'b00:  out_data_reg = i_data_reg;
            2'b01:  out_data_reg = i_data_reg * q_data_reg;
            2'b10:  out_data_reg = i_data_reg & q_data_reg;
            2'b11:  out_data_reg = i_data_reg && q_data_reg;
            default:;
        endcase
    end

    assign out_data = out_data_reg;
    assign ready_out = ready_in;
*/

//-------------------------------------写法2------------------------------------------//

    //MUX
    //三目运算符
    assign out_data = (sel==2'b00) ?  i_data_reg : 
                      (sel==2'b01) ? (i_data_reg * q_data_reg) :
                      (sel==2'b10) ? (i_data_reg & q_data_reg) :
                                     (i_data_reg && q_data_reg);
    assign ready_out = ready_in;

endmodule